#!/bin/bash
###############################################################################
#       脚本名称: logger.sh
#       功能描述: 日志模块统一入口,提供便捷的日志API接口。
#       作者: 林再来
#       日期: 2025-11-04
#       版本: 2.0
#       功能:
#           1、提供统一的日志记录API(log_info、log_error等)
#           2、自动初始化日志系统
#           3、提供配置加载和重载接口
#           4、脚本退出时自动清理资源
#       依赖(插件/命令):
#           无(依赖内部模块)
###############################################################################

# 防止重复加载
if [[ -n "${_LOGGER_LOADED:-}" ]]; then
    return 0
fi
readonly _LOGGER_LOADED=1

# 注意：不在模块加载时自动初始化
# 请在配置系统就绪后，显式调用 log_init 函数

# 加载核心模块
_LOGGER_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${_LOGGER_DIR}/core/log_level.sh"
source "${_LOGGER_DIR}/core/log_config.sh"
source "${_LOGGER_DIR}/core/log_engine.sh"

#-----------------------------------------------------------------------------
# 版本信息
#-----------------------------------------------------------------------------
readonly LOGGER_VERSION="2.2.0"

#-----------------------------------------------------------------------------
# 函数: 初始化日志系统
# 参数: $1 - 配置文件路径(可选,默认使用config/base/logger.yaml)
# 返回: 0-成功, 1-失败
# 说明: 这是使用日志系统的第一步
#-----------------------------------------------------------------------------
function log_init() {
    local config_file="${1:-}"
    
    # 如果没有指定配置文件,尝试查找默认配置
    if [[ -z "$config_file" ]]; then
        # 尝试多个可能的位置
        local possible_configs=(
            "${PROJECT_ROOT}/config/base/logger.yaml"
            "${PROJECT_ROOT}/config/logger.yaml"
            "${_LOGGER_DIR}/../config/base/logger.yaml"
            "${_LOGGER_DIR}/../../config/base/logger.yaml"
        )
        
        for cfg in "${possible_configs[@]}"; do
            if [[ -f "$cfg" ]]; then
                config_file="$cfg"
                break
            fi
        done
        
        if [[ -z "$config_file" ]]; then
            echo "警告: 未找到日志配置文件,使用默认控制台输出" >&2
            # 不初始化配置,引擎会使用默认控制台
            _log_engine_init
            return 0
        fi
    fi
    
    # 初始化配置
    if ! log_config_init "$config_file"; then
        echo "错误: 配置初始化失败" >&2
        return 1
    fi
    
    # 初始化引擎
    if ! _log_engine_init; then
        echo "错误: 日志引擎初始化失败" >&2
        return 1
    fi
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 核心日志记录函数
# 参数: $1 - 日志级别
#       $2 - 模块名(可选,默认main)
#       $3 - 日志消息
#       其余参数 - 额外上下文(key=value格式)
# 返回: 0-成功
# 说明: 这是所有便捷函数的底层实现
#-----------------------------------------------------------------------------
function log_write() {
    local level="$1"
    local module="${2:-main}"
    local message="$3"
    shift 3 || shift $#
    
    _log_process "$level" "$module" "$message" "$@"
}

#-----------------------------------------------------------------------------
# 便捷函数: 记录TRACE级别日志
# 参数: $1 - 模块名(可选,默认main)
#       $2 - 日志消息
#       其余参数 - 额外上下文
#-----------------------------------------------------------------------------
function log_trace() {
    log_write "TRACE" "$@"
}

#-----------------------------------------------------------------------------
# 便捷函数: 记录DEBUG级别日志
# 参数: $1 - 模块名(可选,默认main)
#       $2 - 日志消息
#       其余参数 - 额外上下文
#-----------------------------------------------------------------------------
function log_debug() {
    log_write "DEBUG" "$@"
}

#-----------------------------------------------------------------------------
# 便捷函数: 记录INFO级别日志
# 参数: $1 - 模块名(可选,默认main)
#       $2 - 日志消息
#       其余参数 - 额外上下文
#-----------------------------------------------------------------------------
function log_info() {
    log_write "INFO" "$@"
}

#-----------------------------------------------------------------------------
# 便捷函数: 记录WARN级别日志
# 参数: $1 - 模块名(可选,默认main)
#       $2 - 日志消息
#       其余参数 - 额外上下文
#-----------------------------------------------------------------------------
function log_warn() {
    log_write "WARN" "$@"
}

#-----------------------------------------------------------------------------
# 便捷函数: 记录ERROR级别日志
# 参数: $1 - 模块名(可选,默认main)
#       $2 - 日志消息
#       其余参数 - 额外上下文
#-----------------------------------------------------------------------------
function log_error() {
    log_write "ERROR" "$@"
}

#-----------------------------------------------------------------------------
# 便捷函数: 记录FATAL级别日志
# 参数: $1 - 模块名(可选,默认main)
#       $2 - 日志消息
#       其余参数 - 额外上下文
#-----------------------------------------------------------------------------
function log_fatal() {
    log_write "FATAL" "$@"
}

#-----------------------------------------------------------------------------
# 函数: 重新加载配置
# 返回: 0-成功, 1-失败
#-----------------------------------------------------------------------------
function log_reload() {
    # 清理当前引擎
    _log_engine_cleanup
    
    # 重新加载配置
    if ! log_config_reload; then
        echo "错误: 配置重新加载失败" >&2
        return 1
    fi
    
    # 重新初始化引擎
    if ! _log_engine_init; then
        echo "错误: 引擎重新初始化失败" >&2
        return 1
    fi
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 清理日志系统资源
# 返回: 0-成功
# 说明: 脚本退出前应调用此函数,或通过trap自动调用
#-----------------------------------------------------------------------------
function log_cleanup() {
    _log_engine_cleanup
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 获取日志系统版本
# 返回: 输出版本号
#-----------------------------------------------------------------------------
function log_version() {
    echo "$LOGGER_VERSION"
}

#-----------------------------------------------------------------------------
# 函数: 打印日志系统信息(调试用)
# 返回: 无
#-----------------------------------------------------------------------------
function log_info_dump() {
    echo "=== Logger模块信息 ==="
    echo "版本: $LOGGER_VERSION"
    echo "脚本目录: $_LOGGER_DIR"
    echo ""
    
    # 打印配置信息
    if log_config_is_initialized; then
        log_config_dump
    else
        echo "配置未初始化"
    fi
}

#-----------------------------------------------------------------------------
# 注意: trace_id 相关函数已统一移到 log_context.sh
# 请使用以下函数（由 log_context.sh 提供）：
#   - log_context_set_trace_id <trace_id>
#   - log_context_get_trace_id
#   - log_context_generate_trace_id [prefix]
#   - log_context_clear  # 清除所有context
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
# 注册退出清理
#-----------------------------------------------------------------------------
# 注意：不在库脚本中使用 trap EXIT，避免影响交互式 shell
# 用户如需清理资源，可在主执行脚本中显式调用 log_cleanup
# trap log_cleanup EXIT  # ← 已禁用，避免影响交互式 shell

#-----------------------------------------------------------------------------
# 使用示例
#-----------------------------------------------------------------------------
function _logger_usage_example() {
    cat << 'EOF'
=== Logger模块使用示例 ===

1. 基本使用:
    source "scripts/logger/logger.sh"
    log_init "config/base/logger.yaml"
    log_info "应用启动成功"
    log_error "数据库连接失败"

2. 带模块名:
    log_info "用户登录成功" "auth"
    log_warn "配置文件不存在,使用默认值" "config"

3. 带额外上下文:
    log_info "查询完成" "database" "rows=100" "time=50ms"
    log_error "API调用失败" "api" "url=http://api.example.com" "code=500"

4. 使用追踪ID:
    log_set_trace_id "req-$(uuidgen)"
    log_info "开始处理请求" "handler"
    log_info "处理完成" "handler"
    log_clear_trace_id

5. 不同级别日志:
    log_trace "详细追踪信息"
    log_debug "调试信息"
    log_info "一般信息"
    log_warn "警告信息"
    log_error "错误信息"
    log_fatal "致命错误"

6. 重新加载配置:
    log_reload

7. 查看系统信息:
    log_info_dump

EOF
}

#-----------------------------------------------------------------------------
# 测试函数
#-----------------------------------------------------------------------------
function _logger_test() {
    echo "=== Logger模块完整测试 ==="
    echo ""
    
    echo "1. 显示使用示例:"
    _logger_usage_example
    
    echo ""
    echo "2. 初始化日志系统:"
    local test_config="${PROJECT_ROOT}/config/base/logger.yaml"
    
    if [[ -f "$test_config" ]]; then
        log_init "$test_config"
        echo "  ✓ 使用配置文件: $test_config"
    else
        log_init
        echo "  ✓ 使用默认配置"
    fi
    
    echo ""
    echo "3. 测试各级别日志输出:"
    log_trace "这是TRACE级别日志 - 最详细的追踪信息"
    log_debug "这是DEBUG级别日志 - 调试信息"
    log_info "这是INFO级别日志 - 一般信息"
    log_warn "这是WARN级别日志 - 警告信息"
    log_error "这是ERROR级别日志 - 错误信息"
    log_fatal "这是FATAL级别日志 - 致命错误"
    
    echo ""
    echo "4. 测试带模块名的日志:"
    log_info "应用启动成功" "app"
    log_info "数据库连接成功" "database" "host=localhost" "port=3306"
    log_warn "缓存未命中" "cache" "key=user:123"
    
    echo ""
    echo "5. 测试带追踪ID的日志:"
    log_set_trace_id "test-trace-12345"
    log_info "开始处理请求" "handler"
    log_info "验证用户身份" "auth" "user_id=100"
    log_info "查询数据库" "database" "sql=SELECT * FROM users"
    log_info "请求处理完成" "handler"
    log_clear_trace_id
    
    echo ""
    echo "6. 测试不同上下文信息:"
    log_error "文件读取失败" "io" "file=/etc/config.yaml" "error=Permission denied"
    log_info "API调用成功" "api" "endpoint=/api/users" "method=GET" "status=200" "time=125ms"
    
    echo ""
    echo "7. 显示日志系统信息:"
    log_info_dump
    
    echo ""
    echo "8. 清理日志系统:"
    log_cleanup
    echo "  ✓ 清理完成"
    
    echo ""
    echo "=== 测试完成 ==="
}

# 如果直接执行此脚本,运行测试
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    _logger_test
fi

# 注意: 被source时不再自动初始化
# 请在配置系统初始化后，显式调用 log_init 函数

